function Demo(target: Function) {
    console.log(target)
}

@Demo
class Person {
    name: string
    age: number
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
}

// 应用举例：定义一个装饰器，实现Person实例调用toString时返回JSON.stringify的执行结果

function CustomString(target: Function) {
    target.prototype.toString = function () {
        return JSON.stringify(this)
    }
    // 封锁  对象上的原型不允许操作
    // Object.seal(target.prototype)
}

@CustomString
class Person1 {
    name: string
    age: number
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
}
const p1 = new Person1('张三', 18)
console.log(p1.toString())

/**
 * 关于返回值：
 * 类装饰器有返回值：若类装饰器返回一个新的类，那这个新类将替换掉被装饰的类。
 * 类装饰器无返回值：若类装饰器无返回值或者返回undefined，那被装饰的类不会被替换。
 * 
 */

function Demo2(target: Function) {
    return class {
        test() {
            console.log(200)
            console.log(300)
            console.log(400)
        }
    }
}

@Demo2
class Person2 {
    test() {
        console.log(100)
    }
}

console.log(Person2)